package com.catazzz.springbootstudy.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;

/**
 * @作者: Tao
 * @日期: 2024/12/27
 * @时间: 13:20
 * @描述: 数据库审计公共基础类<br><pre>
 *     JPA:
 *      1. 创建时间、更新时间、创建人、更新人等公共字段
 *      ＠Column（updatable=false）将字段设置为不可修改的，效果类似于Java中使用final关键字修饰变量，只允许一次赋值。创建人和创建时间只需插入一次，无须更新
 *      ＠MappedSuperclass 注解用于标记一个类作为基类，该基类的字段将被映射到子类的表中
 *      ＠EntityListeners 注解用于指定一个或多个监听器类，这些监听器类会在实体类的生命周期事件（如持久化、更新、删除等）发生时被调用
 *      AuditingEntityListener 是Spring Data JPA提供的一个实体监听器类，用于自动记录实体的创建时间和更新时间
 *     Mybatis:
 *      1.@TableId，用于指定实体类中主键字段
 *      2.@TableField，用于标记实体类中的字段
 *          FieldFill.INSERT 仅在插入时进行填充
 *          FieldFill.UPDATE 仅在更新时进行填充
 *          FieldFill.INSERT_UPDATE 插入和更新记录时填充
 */
@Data
@EqualsAndHashCode(callSuper = true)
public abstract class BaseEntity<T extends Model<T>> extends Model<T> {

    @ApiModelProperty(hidden = true)
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    @ApiModelProperty(hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private String creator;

    @ApiModelProperty(hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    @ApiModelProperty(hidden = true)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String modifier;

    @ApiModelProperty(hidden = true)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
